/***************************************************************************
 * Copyright (c) 2009,2010, Code Aurora Forum. All rights reserved.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 ***************************************************************************/

.syntax unified
.code 32
.fpu neon
.align 4
.globl	memset32_neon
.hidden memset32_neon

/* r0 = buffer, r1 = value, r2 = times to write */
memset32_neon:
cmp		r2, #1
streq		r1, [r0], #4
bxeq		lr

cmp		r2, #4
bgt		memset32_neon_start
cmp		r2, #0
bxeq		lr
memset32_neon_small:
str		r1, [r0], #4
subs		r2, r2, #1
bne		memset32_neon_small
bx		lr
memset32_neon_start:
cmp		r2, #16
blt		memset32_dropthru
vdup.32		q0, r1
vmov		q1, q0
cmp		r2, #32
blt		memset32_16
cmp		r2, #64
blt		memset32_32
cmp		r2, #128
blt		memset32_64
memset32_128:
movs		r12, r2, lsr #7
memset32_loop128:
subs		r12, r12, #1
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
bne		memset32_loop128
ands		r2, r2, #0x7f
bxeq		lr
memset32_64:
movs		r12, r2, lsr #6
beq		memset32_32
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
ands		r2, r2, #0x3f
bxeq		lr
memset32_32:
movs		r12, r2, lsr #5
beq		memset32_16
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
ands		r2, r2, #0x1f
bxeq		lr
memset32_16:
movs		r12, r2, lsr #4
beq		memset32_dropthru
and		r2, r2, #0xf
vst1.64		{q0, q1}, [r0]!
vst1.64		{q0, q1}, [r0]!
memset32_dropthru:
rsb		r2, r2, #15
add		pc, pc, r2, lsl #2
nop
str		r1, [r0, #56]
str		r1, [r0, #52]
str		r1, [r0, #48]
str		r1, [r0, #44]
str		r1, [r0, #40]
str		r1, [r0, #36]
str		r1, [r0, #32]
str		r1, [r0, #28]
str		r1, [r0, #24]
str		r1, [r0, #20]
str		r1, [r0, #16]
str		r1, [r0, #12]
str		r1, [r0, #8]
str		r1, [r0, #4]
str		r1, [r0, #0]
bx		lr

.end
